package br.com.ro.view;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;

import br.com.ro.model.dao.ClienteDao;
import br.com.ro.model.dao.ObjetoOcorrenciaDao;
import br.com.ro.model.dao.ProjetoDao;
import br.com.ro.model.entity.Cliente;
import br.com.ro.model.entity.ObjetoOcorrencia;
import br.com.ro.model.entity.Projeto;
import br.com.ro.util.BeanFactory;
import br.com.ro.util.Utils;

@ManagedBean(name = "objetoOcorrenciaBean")
@SessionScoped
public class ObjetoOcorrenciaBean implements Serializable {

	private static final long serialVersionUID = 1L;
	private ObjetoOcorrencia objetoOcorrencia = new ObjetoOcorrencia();
	private List<ObjetoOcorrencia> listaObjetoOcorrencias = new ArrayList<ObjetoOcorrencia>();
	private ObjetoOcorrenciaDao objetoOcorrenciaDao = (ObjetoOcorrenciaDao) BeanFactory.getBean("objetoOcorrenciaDao", ObjetoOcorrenciaDao.class);

	private ClienteDao cDao = (ClienteDao) BeanFactory.getBean("clienteDao", ClienteDao.class);
	private ProjetoDao pDao = (ProjetoDao) BeanFactory.getBean("projetoDao", ProjetoDao.class);

	private Integer idCliente = null;
	private Integer idProjeto = null;
	private List<SelectItem> listaCliente = null;
	private List<SelectItem> listaProjeto = null;

	public ObjetoOcorrenciaBean() {
		atualizarTela();
		popularCliente();
	}

	private void popularCliente() {
		listaCliente = new ArrayList<SelectItem>();
		List<Cliente> cli = cDao.listAll();
		for (Cliente cliente : cli) {
			listaCliente.add(new SelectItem(cliente.getId(), cliente.getNome()));
		}
	}

	public void clienteAlterado() {
		listaProjeto = new ArrayList<SelectItem>();
		idProjeto = null;

		List<Projeto> p = pDao.findBySQL("from Projeto m where m.clienteId = " + idCliente);
		for (Projeto projeto : p) {
			listaProjeto.add(new SelectItem(projeto.getId(), projeto.getDescricao()));
		}
	}

	public void projetoAlterado() {
		if (idProjeto != null && idProjeto > 0) {
			listaObjetoOcorrencias = objetoOcorrenciaDao.findBySQL("from ObjetoOcorrencia m where m.projetoId = " + idProjeto);
		}
	}

	/**
	 * Limpa os campos input e atualiza a lista de usuários cadastrados
	 */
	private void atualizarTela() {
		objetoOcorrencia = new ObjetoOcorrencia();
		listaObjetoOcorrencias = objetoOcorrenciaDao.listAll();
		idCliente = null;
		idProjeto = null;
	}

	public void limpar() {
		objetoOcorrencia = new ObjetoOcorrencia();
		idCliente = null;
		idProjeto = null;
	}

	/**
	 * Grava novo registro ou atualiza um registro
	 */
	public void gravar() {
		Object[] obj = { idProjeto, "O Projeto", getObjetoOcorrencia().getDescricao(), "Nome da Tela" };
		if (Utils.getValilador().validar(obj))
			return;

		getObjetoOcorrencia().setProjetoId(new Projeto(idProjeto));
		objetoOcorrenciaDao.save(getObjetoOcorrencia());
		objetoOcorrencia = new ObjetoOcorrencia();
		projetoAlterado();
	}

	/**
	 * Exclui um registro da tabela usuario
	 */
	public void excluir() {
		objetoOcorrenciaDao.delete(getObjetoOcorrencia());
		if (idProjeto != null && idProjeto > 0) {
			objetoOcorrencia = new ObjetoOcorrencia();
			projetoAlterado();
		} else {
			atualizarTela();
		}
	}

	public List<ObjetoOcorrencia> getListaObjetoOcorrencias() {
		return listaObjetoOcorrencias;
	}

	public void setListaObjetoOcorrencias(List<ObjetoOcorrencia> listaObjetoOcorrencias) {
		this.listaObjetoOcorrencias = listaObjetoOcorrencias;
	}

	public ObjetoOcorrencia getObjetoOcorrencia() {
		return objetoOcorrencia;
	}

	public void setObjetoOcorrencia(ObjetoOcorrencia objetoOcorrencia) {
		popularCliente();
		idCliente = objetoOcorrencia.getProjetoId().getClienteId().getId();
		clienteAlterado();
		idProjeto = objetoOcorrencia.getProjetoId().getId();
		this.objetoOcorrencia = objetoOcorrencia;
	}

	public Integer getIdCliente() {
		return idCliente;
	}

	public void setIdCliente(Integer idCliente) {
		this.idCliente = idCliente;
	}

	public Integer getIdProjeto() {
		return idProjeto;
	}

	public void setIdProjeto(Integer idProjeto) {
		this.idProjeto = idProjeto;
	}

	public List<SelectItem> getListaCliente() {
		return listaCliente;
	}

	public void setListaCliente(List<SelectItem> listaCliente) {
		this.listaCliente = listaCliente;
	}

	public List<SelectItem> getListaProjeto() {
		return listaProjeto;
	}

	public void setListaProjeto(List<SelectItem> listaProjeto) {
		this.listaProjeto = listaProjeto;
	}

}
